<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="BmR2l" id="BmR2l"><span data-lake-id="ud6a7574a" id="ud6a7574a">典型回答</span></h1>
  <p data-lake-id="u9e06db7d" id="u9e06db7d"><br></p>
  <p data-lake-id="u21107db7" id="u21107db7"><span data-lake-id="u25a3f366" id="u25a3f366">在 MySQL 5.6 之前，InnoDB 索引构建期间会对表进行排它锁定，这意味着在索引构建期间，其他会话不能读取或修改表中的任何数据。这将导致长时间阻塞和性能问题。</span></p>
  <p data-lake-id="u24468686" id="u24468686"><br></p>
  <p data-lake-id="u8718ff50" id="u8718ff50"><strong><span data-lake-id="ua8cbf992" id="ua8cbf992">自 MySQL 5.6 开始，InnoDB 使用一种称为“Online DDL”的技术，允许在不阻塞其他会话的情况下创建或删除索引</span></strong><span data-lake-id="uc883a270" id="uc883a270">。Online DDL 针对不同的操作，有多种实现方式，包括COPY，INSTANT以及INPLACE</span></p>
  <p data-lake-id="u9ad10496" id="u9ad10496"><span data-lake-id="uf7859426" id="uf7859426">​</span><br></p>
  <p data-lake-id="u59012ac8" id="u59012ac8"><span data-lake-id="u7a9a0561" id="u7a9a0561">因为DDL有很多种操作，比如创建索引、增加字段、增加外键等，所以不同的操作支持的类型也不一样，具体支持方式可以在mysql官方可以看到（</span><a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html" target="_blank" data-lake-id="u3b070910" id="u3b070910"><span data-lake-id="u4859d812" id="u4859d812">https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html</span></a><span data-lake-id="u507a1544" id="u507a1544"> ），拿索引创建举例：</span></p>
  <p data-lake-id="uc08fdee2" id="uc08fdee2"><span data-lake-id="ue56ab573" id="ue56ab573">​</span><br></p>
  <p data-lake-id="u08303c17" id="u08303c17"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1699088229537-758c4d4a-4363-4d1b-9581-ce8f532d0141.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_50%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u942a0fa4" id="u942a0fa4"><br></p>
  <p data-lake-id="u501940c2" id="u501940c2"><span data-lake-id="u4284d156" id="u4284d156">从上表中可以看到，当我们创建、删除或者重命名一个索引的时候，是会用到in place的模式。</span></p>
  <p data-lake-id="u30081814" id="u30081814"><br></p>
  <p data-lake-id="u12270ae8" id="u12270ae8"><span data-lake-id="ub33def7a" id="ub33def7a">需要注意的是，虽然Online DDL 可以减少锁定时间和对性能的影响，但在索引构建期间仍然可能出现锁定和阻塞。例如，在添加索引时，如果表中有许多未提交的事务，则需要等待这些事务提交后才能开始索引构建。</span><strong><span data-lake-id="ue99f9d57" id="ue99f9d57">因此，建议在非高峰期进行此类操作，以避免影响用户的正常使用。</span></strong><span data-lake-id="u725a4f6e" id="u725a4f6e">在进行任何DDL操作之前，最好进行充分的测试和规划，并且确保有备份和回滚计划，以防意外情况的发生。</span></p>
  <p data-lake-id="u63a8cdee" id="u63a8cdee"><br></p>
  <h1 data-lake-id="ckkg1" id="ckkg1"><span data-lake-id="ue39fe547" id="ue39fe547">扩展知识</span></h1>
  <p data-lake-id="u5372075f" id="u5372075f"><br></p>
  <h2 data-lake-id="ff7FM" id="ff7FM"><span data-lake-id="u6ba086d7" id="u6ba086d7">Online DDL原理</span></h2>
  <p data-lake-id="uaf9d0591" id="uaf9d0591"><br></p>
  <p data-lake-id="ue7b159a4" id="ue7b159a4"><span data-lake-id="u1eae339f" id="u1eae339f">​</span><br></p>
  <p data-lake-id="u08deb5bb" id="u08deb5bb"><span data-lake-id="u2d685aa4" id="u2d685aa4">​</span><br></p>
 </body>
</html>